﻿using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

namespace MessageInfo.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class RabbtController : ControllerBase
    {
        /// <summary>
        /// 生产者模式
        /// </summary>
        /// <param name="userMdoel"></param>
        /// <returns></returns>
        [HttpPost]
        public string AddProduct(string userMdoel)
        {
            //创建工厂，连接RabbitMq
            var factory = new ConnectionFactory();
            factory.HostName = "10.223.8.24";
            factory.Port = 5672;
            factory.UserName = "admin";
            factory.Password = "123456";
            var connection = factory.CreateConnection();

            //创建通道
            var channel = connection.CreateModel();

            //创建队列
            //参数  队列名称  是否持久化  是否排他  是否自动删除  设置队列额外可选参数的可选参数表
            var usermodels = channel.QueueDeclare("usermodels", false, false, false, null);

            //用户信息序列化
            //string usermodelstring = JsonConvert.SerializeObject(userMdoel);

            //用户信息二进制
            var usermodelbyte = Encoding.UTF8.GetBytes(userMdoel);

            //存储用户信息
            //参数  交换机  队列名称 基本的参数(使用默认的)   数据()
            channel.BasicPublish("", usermodels, channel.CreateBasicProperties(), usermodelbyte);

            return "添加成功";
        }




        /// <summary>
        /// 消费者模式
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string Consumer()
        {

            //创建工厂，连接RabbitMq
            var factory = new ConnectionFactory();
            factory.HostName = "10.223.8.24";
            factory.Port = 5672;
            factory.UserName = "admin";
            factory.Password = "123456";
            var connection = factory.CreateConnection();

            //创建通道
            var channel = connection.CreateModel();



            //创建IBasicConsumer实现类
            var consumer = new EventingBasicConsumer(channel);
            //接受用户信息
            consumer.Received += async (model, data) =>
            {
                //获取用户信息二进制
                var usermodlebyte = data.Body;
                //用户信息二进制序列化
                var usermodlestring = Encoding.UTF8.GetString(usermodlebyte.ToArray());
                //用户信息反序列化
                //UserModel? userMdoel = JsonConvert.DeserializeObject<UserModel>(usermodlestring);
            };

            //接收用户信息
            //参数 队列名称  是否自动确认接受成功  消费者标签(为空)  是否禁止接收同一连接信息  是否独占消费者  可选参数  消费对象
            channel.BasicConsume("usermodels", true, "", false, false, null, consumer);

            return "添加成功";
        }


        /// <summary>
        /// 牛
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string Niu()
        {

            //创建工厂，连接RabbitMq
            var factory = new ConnectionFactory();
            factory.HostName = "10.223.8.12";
            factory.Port = 5672;
            factory.UserName = "admin";
            factory.Password = "password123";
            // 使用 using 确保连接与通道在请求结束后正确释放
            using var connection = factory.CreateConnection();
            using var channel = connection.CreateModel();

            // 从队列直接拉取一条消息（BasicGet 为同步拉取，非事件订阅）
            // 第二个参数 autoAck=true 表示一旦取到消息立即确认；
            // 如果你需要先处理再确认，可改为 false 并在处理成功后调用 BasicAck。
            var result = channel.BasicGet("usermodels", true);
            if (result == null)
            {
                return "队列中没有消息";
            }

            // 还原消息体为字符串并反序列化为 UserModel
            var bodyBytes = result.Body.ToArray();
            var json = Encoding.UTF8.GetString(bodyBytes);
            //var userModel = JsonConvert.DeserializeObject<UserModel>(json);

            // 返回 200，响应体即为反序列化后的对象（Swagger 会以 JSON 展示）
            return json;
        }
    }
}
